在第一篇提到過,定義並呼叫函式如下
defmodule Say do
def hi(name) do
IO.puts("Hi! #{name}.")
end
end
Say.hi("Bily")
#=> Hi! Bily.
在模組內可以直接呼叫函式名,不用再加模組名
defmodule Say do
def hi(name) do
IO.puts("Hi! #{name}.")
end
def hix3(name) do
hi(name) # 在這邊可直接呼叫 hi
hi(name)
hi(name)
end
end
若是在別的模組,可以使用 import
defmodule Say do
def hi(name) do
IO.puts("Hi! #{name}.")
end
end
defmodule GreetEddy do
import Say
def hi do
hi("Eddy") # import 後,在這個模組可以直接使用
end
end
在 Elixir 能帶值的地方就有 pattern matching
呼叫函式也不例外
module Say do
def hi("Jack") do
"Hi, admin Jack"
end
def hi(name) do
"Hi, #{name}"
end
end
使用多個同名函式,在呼叫時會依順序從上到下嘗試
若呼叫 hi("Jack")
,將會在第一個匹配成功,後續就不再執行
defmodule GuessGame do
def play do
number = Enum.random(1..100)
IO.puts("我想了一個 1-100 的數字,請猜猜看!")
guess_loop(number)
end
defp guess_loop(number) do
input =
IO.gets("請輸入你的猜測: ")
|> String.trim()
|> String.to_integer()
case input do
^number ->
IO.puts("恭喜猜中!")
guess when guess < number ->
IO.puts("太小了!")
guess_loop(number)
guess when guess > number ->
IO.puts("太大了!")
guess_loop(number)
end
end
end
defmodule GuessGame do
def play do
number = Enum.random(1..100)
IO.puts("我想了一個 1-100 的數字,請猜猜看!")
guess(number, get_input())
end
defp guess(number, number) do
IO.puts("恭喜猜中!")
end
defp guess(number, guess) when guess < number do
IO.puts("太小了!")
guess(number, get_input())
end
defp guess(number, guess) when guess > number do
IO.puts("太大了!")
guess(number, get_input())
end
defp get_input do
IO.gets("請輸入你的猜測: ")
|> String.trim()
|> String.to_integer()
end
end
如果函式有更短的函式主體,可以把 def
使用原本的語法來呼叫
module Say do
def hi("Jack"), do: "Hi, admin Jack"
def hi("José"), do: "Hi, creater of Elixir"
def hi(name), do: name
end
為什麼可以改寫這樣後面的 do
end
語法糖,這邊先記住這個寫法即可,要記得 ,